/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package shell;

import Escalonador.Escalonador;
import Programas.CriarDiversosProcesso;
import Programas.Processo;
import gerenciador_de_memoria.GerenciadorMemoria;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import sistema_de_arquivos.Arquivo;
import sistema_de_arquivos.Diretorio;
import sistema_de_arquivos.Disco;
import sistema_de_arquivos.Erro;
import sistema_de_arquivos.SistemaArquivos;

/**
 *
 * @author Edilson Anselmo Corrêa Júnior
 */
public class Shell {

    public static ArrayList<ArrayList<Processo>> todosProcessos = new ArrayList<ArrayList<Processo>>();
    public static CriarDiversosProcesso criar = new CriarDiversosProcesso();

    public static void main(String[] args) throws InterruptedException {
        int fd;
        Erro erro;
        Arquivo arq;
        String comando;
        String[] parametros;
        Scanner leitor = new Scanner(System.in);
        Diretorio raiz = new Diretorio("/", true, true, 0);
        SistemaArquivos sa = new SistemaArquivos(new Disco(4, 250), raiz);
        ArrayList<String> filhos;
        //Declarações necessárias ao Gerenciador de Memória
        GerenciadorMemoria gm = new GerenciadorMemoria(sa);
        //Declarações necessárias ao Escalonador
        Escalonador escalonador = new Escalonador(criar, todosProcessos, gm);
        boolean pause = true;
        boolean start = false;
        ExecutorService exec = Executors.newFixedThreadPool(2);


        System.out.println("::::::Sistema Operacional - 5º Período de Ciência da Computação::::::");
        do {
            System.out.print("> ");

            comando = null;

            comando = leitor.nextLine();

            parametros = comando.split("( {1,}|\t)");

            if (parametros.length > 0) {
                switch (parametros[0]) {
                    case "ls":
                        if (parametros.length == 2) {
                            sa.shell_ls(parametros[1]);
                        } else {
                            sa.shell_ls("");
                        }
                        break;
                    case "cd":
                        if (parametros.length == 2) {
                            sa.shell_cd(parametros[1]);
                        } else {
                            System.out.println("cd: Faltam parametros.");
                        }
                        break;
                    case "mkdir":
                        if (parametros.length == 2) {
                            sa.shell_mkdir(parametros[1]);
                        } else {
                            System.out.println("mkdir: Faltam parametros.");
                        }
                        break;
                    case "mdir":
                        if (parametros.length == 2) {
                            sa.shell_mdir(parametros[1]);
                        } else {
                            System.out.println("mdir: Faltam parametros");
                        }
                        break;
                    case "pwd":
                        sa.shell_pwd();
                        break;
                    case "rm":
                        if (parametros.length == 2) {
                            sa.shell_rm(parametros[1]);
                        } else {
                            System.out.println("rm: Faltam parametros.");
                        }
                        break;
                    case "df":
                        sa.shell_df();
                        break;
                    case "lsof":
                        sa.shell_lsof();
                        break;
                    case "close":
                        if (parametros.length == 2) {
                            sa.shell_close(Integer.parseInt(parametros[1]));
                        } else {
                            System.out.println("close: Faltam parametros.");
                        }
                        break;
                    case "stat":
                        if (parametros.length == 2) {
                            sa.shell_stat(parametros[1]);
                        } else {
                            System.out.println("stat: Faltam parametros.");
                        }
                        break;
                    case "mv":
                        if (parametros.length == 3) {
                            sa.shell_mv(parametros[1], parametros[2]);
                        } else {
                            System.out.println("mv: Faltam parametros.");
                        }
                    case "kill":
                        if (parametros.length == 3) {
                            switch (parametros[1]) {
                                case "-1":
                                    System.out.println(gm.kill1(Integer.parseInt(parametros[2])));
                                    break;
                                case "-2":
                                    System.out.println(gm.kill2(Integer.parseInt(parametros[2])));
                                    break;
                                case "-3":
                                    System.out.println(gm.kill3(Integer.parseInt(parametros[2])));
                                    break;
                                case "-9":
                                    System.out.println(gm.kill9(Integer.parseInt(parametros[2])));
                                    break;
                                default:
                                    System.out.println("Parâmetro inválido.");
                                    break;
                            }
                        } else if (parametros.length == 2 && parametros[1].equals("-l")) {
                            System.out.println("1)SIGBLOQ   2)SIGPRO    3)SIGCONT   9)SIGKILL");
                        } else {
                            System.out.println("kill: Faltam parametros");
                        }
                        break;
                    case "killall":
                        if (parametros.length == 2) {
                            System.out.println(gm.killAll(Integer.parseInt(parametros[1])));
                        } else {
                            System.out.println("killall: Faltam parametros");
                        }
                        break;
                    case "schell":
                        System.out.println("Política: " + escalonador.getPolitica());
                        System.out.println(escalonador.schell2());
                        break;
                    case "mem":
                        if (parametros.length == 2) {
                            switch (parametros[1]) {
                                case "-g":
                                    System.out.println(gm.memVisual());
                                    break;
                                case "-e":
                                    System.out.println(gm.mem());
                                    break;
                                case "-s":
                                    System.out.println("ID\tGRUPO ID\tTEMPO\tPRIORIDADE\tTAMANHO\n");
                                    sa.swap_ps();
                                    break;
                                default:
                                    System.out.println("Parâmetro inválido.");
                            }
                        } else {
                            System.out.println("mem: Faltam parametros");
                        }
                        break;
                    case "memcopy":
                        System.out.println(gm.memCopy());
                        break;
                    case "memclear":
                        System.out.println(gm.memClear());
                        break;
                    case "startProcess":
                        if (parametros.length == 2 && parametros[1].equals("comecar")) {
                            System.out.println("processos startados");
                            System.out.println("Comecando o escalonamento politica: " + escalonador.getPolitica());
                            criar.start();
                            escalonador.start();
                            
                        } else {
                            System.out.println("parametro invalido");
                        }
                        break;
                    case "schellPolicy":
                        if (parametros.length == 2) {
                            switch (parametros[1]) {
                                case "-l":
                                    System.out.println("RoundRobin");
                                    System.out.println("Prioridade");
                                    System.out.println("ProximoMaisCurto");
                                    System.out.println("Loteria");
                                    System.out.println("FairShare");
                                    System.out.println("FilasMultiplas");
                                    break;
                                case "RoundRobin":
                                    escalonador.suspend();
                                    gm.memClear();
                                    escalonador.schellPolicy("RoundRobin");
                                    escalonador.resume();
                                    break;
                                case "Prioridade":
                                    escalonador.suspend();
                                    gm.memClear();
                                    escalonador.schellPolicy("Prioridade");
                                    escalonador.resume();
                                    break;
                                case "ProximoMaisCurto":
                                    escalonador.suspend();
                                    gm.memClear();
                                    escalonador.schellPolicy("ProximoMaisCurto");
                                    escalonador.resume();
                                    break;
                                case "Loteria":
                                    escalonador.suspend();
                                    gm.memClear();
                                    escalonador.schellPolicy("Loteria");
                                    escalonador.resume();
                                    break;
                                case "FairShare":
                                    escalonador.suspend();
                                    gm.memClear();
                                    escalonador.schellPolicy("FairShare");
                                    escalonador.resume();
                                    break;
                                case "FilasMultiplas":
                                    escalonador.suspend();
                                    gm.memClear();
                                    escalonador.schellPolicy("FilasMultiplas");
                                    escalonador.resume();
                                    break;
                                default:
                                    System.out.println("schellPolicy: Faltam parametros");
                                    break;
                            }
                        } else {
                            System.out.println("schellPolicy: Faltam parametros");
                        }
                        break;
                    case "waitprocess":
                        if (parametros.length == 2) {
                            escalonador.waitProcess(Integer.parseInt(parametros[1]));                            
                        }break;                        
                    case "resumeprocess":
                        if (parametros.length == 2) {
                            escalonador.resumeProcess(Integer.parseInt(parametros[1]));                            
                        }break;
                    case "exit":
                        break;
                    default:
                        System.out.println(parametros[0] + ": comando nao reconhecido");
                }
            }


        } while (!comando.equalsIgnoreCase("exit"));
        System.exit(0);
    }
}
